package DAOs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import supermercadoGrupal.Producto;

public class ProductoDAO {

private static final ProductoDAO instance = new ProductoDAO();
private Connection connection;

	private ProductoDAO()
	{
		try{
			this.connection=DriverManager.getConnection("jdbc:mysql://localhost/supermercado?user=root");
		}
		catch(SQLException e)
		{
			throw new RuntimeException("Error al acceder a la db",e);
		}
	}
	public static ProductoDAO getInstance(){
		
		return ProductoDAO.instance;
	}
	/**
	 * Permite agregar nuevos productos al SuperMercado
	 * @param prod
	 * @throws SQLException
	 */
	public void agregar (Producto prod) throws SQLException
	{
		
		String sql = "INSERT INTO producto (precio, nombre, codigo_de_barras) VALUES (?, ?, ?)";
		PreparedStatement pSt = this.connection.prepareStatement(sql);
		
		pSt.setString(1, Float.toString(prod.getPrecio()));
		pSt.setString(2, prod.getNombre());
		pSt.setString(3, prod.getCodigoDeBarras());

		pSt.execute();
		
		ResultSet rs = pSt.getGeneratedKeys();
		rs.next();
		int id = rs.getInt(1);
		rs.close();
		
		prod.setId(id);
		
		pSt.close();		
		
	}
	/**
	 * Permite actualizar nuevos productos del SuperMercado
	 * @param prod
	 * @throws SQLException 
	 */
	public void actualizar(Producto prod) throws SQLException
	{
		if (existeProducto(prod)) {

			String sql = "Update producto set precio=?, nombre=?, codigo_de_barras=? where id=?";
			PreparedStatement pSt = this.connection.prepareStatement(sql);
			
			pSt.setFloat(1, (prod.getPrecio()));
			pSt.setString(2, prod.getNombre());
			pSt.setString(3, prod.getCodigoDeBarras());
			pSt.setInt(4, prod.getId());
			pSt.execute();

			pSt.close();

		}
			
	}
	/**
	 * Permite saber si el producto solicitado existe en el SuperMercado
	 * @param prod
	 * @return
	 * @throws SQLException
	 */
	private boolean existeProducto(Producto prod) throws SQLException
	{
		String sql = "Select * from Producto where id=?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setInt(1, prod.getId());
		return pSt.execute();
		
	}
	/**
	 * Busco en el SuperMercado un producto a partir de su codigo de barras y lo retorno
	 * @param codigoDeBarras
	 * @return
	 * @throws SQLException
	 */
	public Producto findbyCodigoBarras(String codigoDeBarras) throws SQLException
	{
		String sql = "Select * from Producto where codigo_de_barras=?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setString(1, codigoDeBarras);
		
		pSt.execute();
		ResultSet rs= pSt.getResultSet();
		if(!rs.next()){
			return null;
		}
		Producto prod = new Producto(rs.getString(4), rs.getString(3), rs.getFloat(2), rs.getInt(1));

		return prod;

	}
	
	public Producto findbyId(int id) throws SQLException
	{
		String sql = "SELECT * FROM producto WHERE id=?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setInt(1, id);
		
		pSt.execute();
		
		ResultSet rs= pSt.getResultSet();
		if(!rs.next()){
			return null;
		}
		
		Producto prod = new Producto(rs.getString("codigo_de_barras"), rs.getString("nombre"), rs.getFloat("precio"), rs.getInt("id"));

		return prod;
	}
	
}
